/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.helpmultioperacion.data;

import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Gabriel Bran
 */
public abstract class Factory {

    private java.sql.Statement cmdSQL = null;
    private java.sql.ResultSet resulset = null;
    Conexion c = new Conexion();

    public Factory() {
        c.setDriver("com.mysql.jdbc.Driver");
        c.setUrl("jdbc:mysql://localhost:3306/itca");
        c.setUsuario("root");
        c.setPassword("");
    }

    public java.sql.Connection obtenerConexion() {
        try {
            return c.getConexion();
        } catch (InstantiationException ex) {
            Logger.getLogger(Factory.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(Factory.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Factory.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    public java.sql.ResultSet listaEntidades() {
        try {
            cmdSQL = obtenerConexion().createStatement();
            resulset = cmdSQL.executeQuery("select * from " + getTabla());
        } catch (SQLException ex) {
            Logger.getLogger(Factory.class.getName()).log(Level.SEVERE, null, ex);
        }
        return resulset;
    }

    public void guardar(java.util.HashMap<Integer, String> parametros) {
        try {

            String parametro = "insert into " + getTabla() + getCamposTabla() + " values (" + getParametrosInto(parametros) + ")";
            System.out.println(parametro);
            cmdSQL.executeUpdate(parametro);
        } catch (SQLException ex) {
            Logger.getLogger(Factory.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void modificar(java.util.HashMap<String, String> parametros) {
        try {
            String parametro = "update " + getTabla() + " set " + getListaParametrosUpdate(parametros);
            System.out.println(parametro);
            cmdSQL.executeUpdate(parametro);
        } catch (SQLException ex) {
            Logger.getLogger(Factory.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void eliminar(java.util.HashMap<String, String> parametros) {
        try {
            String parametro = "delete from " + getTabla() + " where " + getListaParametros(parametros);
            System.out.println(parametro);
            cmdSQL.executeUpdate(parametro);
        } catch (SQLException ex) {
            Logger.getLogger(Factory.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public java.sql.ResultSet buscar(java.util.HashMap<String, String> parametros) {
        try {
            cmdSQL = obtenerConexion().createStatement();
            resulset = cmdSQL.executeQuery("select * from " + getTabla() + " where " + getListaParametros(parametros));
        } catch (SQLException ex) {
            Logger.getLogger(Factory.class.getName()).log(Level.SEVERE, null, ex);
        }
        return resulset;
    }

    private String getListaParametros(java.util.HashMap<String, String> parametros) {
        String parametro = "";
        int contador = 1;
        for (String k : parametros.keySet()) {
            if (parametros.size() > 1) {
                if (parametros.size() == contador) {
                    parametro += k + " = " + parametros.get(k);
                } else {
                    parametro += k + " = " + parametros.get(k) + " and ";
                }
            } else {
                parametro += k + " = " + parametros.get(k);
            }
            contador++;
        }
        return parametro;
    }
    private String getListaParametrosUpdate(java.util.HashMap<String, String> parametros) {
        String parametro = "";
        int contador = 1;
        for (String k : parametros.keySet()) {
            if (parametros.size() > 1) {
                if (parametros.size() == contador) {
                    parametro += k + " = " + parametros.get(k);
                } else {
                    parametro += k + " = " + parametros.get(k) + ", ";
                }
            } else {
                parametro += k + " = " + parametros.get(k);
            }
            contador++;
        }
        return parametro;
    }

    private String getParametrosInto(java.util.HashMap<Integer, String> parametros) {
        String parametro = "";
        int contador = 1;
        for (Integer k : parametros.keySet()) {
            if (parametros.size() > 1) {
                if (parametros.size() == contador) {
                    parametro += parametros.get(k);
                } else {
                    parametro += parametros.get(k) + ", ";
                }
            } else {
                parametro += parametros.get(k);
            }
            contador++;
        }
        return parametro;
    }

    public abstract String getTabla();
    public abstract String getCamposTabla();
}
